package com.ysstech.common.util.verifyutil;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 验证码图片
 */
public class VerifyImage {
    private final static Logger logger = LoggerFactory.getLogger(VerifyImage.class);
    private static double rotateAngle = 0.2;
    private static int fontColor = 80;
    private static int width = 80;
    private static int height = 28;
    private static String[] name = {"dialog.3", "serif.2", "monospaced.0"};
    private static String VerifyCodeBgPath = null;
    private static Random random = new Random();
    private static BufferedImage image;

    public static BufferedImage getVerifyImage(String verifycode,int length) throws Exception {
        try {
            int codeLength = length;// 验证码长度
            int mixTimes = 168;// 模糊程度参数
            Color bgColor = getRandColor(200, 250);// 背景颜色
            Color bfColor = new Color(0, 0, 0);// 字体颜色
            boolean ifRandomColor = true;// 单个字符是否颜色随机
            boolean ifMixColor = true;// 模糊线是否颜色随机


            // 在内存中创建图象
            int width = 13 * codeLength + 6, height = 34;
//		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 获取图形上下文
            Graphics g = image.getGraphics();
            // 设定背景色
            g.setColor(bgColor);
            g.fillRect(0, 0, width, height);
            // 设定字体
            g.setFont(new Font("Arail", Font.BOLD, 20));
            // 画边框
            g.setColor(new Color(33, 66, 99));
            g.drawRect(0, 0, width - 1, height - 1);
            // 随机产生干扰线，使图象中的认证码不易被其它程序探测到
            g.setColor(getRandColor(160, 200));
            for (int i = 0; i < mixTimes * codeLength / 10; i++) {
                if (ifMixColor) {
                    g.setColor(getRandColor(160, 200));
                }
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(12);
                int yl = random.nextInt(12);
                g.drawLine(x, y, x + xl, y + yl);
            }
            // 取随机产生的认证码(4位数字)
//		String sRand = "";
            for (int i = 0; i < codeLength; i++) {
                // 将认证码显示到图象中
                if (ifRandomColor) {
                    g.setColor(getRandColor(20, 110, 0));
                } else {
                    g.setColor(bfColor);
                }
                // 调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成
                g.drawString(verifycode.substring(i, i + 1), 13 * i + 6, 25);
            }
            g.dispose();
        } catch (Exception ex) {
            logger.error(ex.toString());
            throw new Exception( "生成验证码失败，请稍后重试！");
        }
        return image;
    }

    private static Color getRandColor(int fc, int bc) {
        return getRandColor(fc, bc, fc);
    }

    private static Color getRandColor(int fc, int bc, int interval) {
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - interval);
        int g = fc + random.nextInt(bc - interval);
        int b = fc + random.nextInt(bc - interval);
        return new Color(r, g, b);
    }
}